/**
 * 设备信息工具库
 * 用于获取和计算设备的屏幕尺寸和UI组件高度信息
 */

import { storage } from './storage.js';

// 默认值配置
const DEFAULT_VALUES = {
    // 屏幕默认值
    SCREEN: {
        WIDTH: 375, // 默认屏幕宽度
        HEIGHT: 667, // 默认屏幕高度
    },
    // UI组件默认高度
    UI: {
        STATUS_BAR: 20, // 状态栏默认高度（iOS 20px, Android 24px）
        NAV_BAR: 44, // 导航栏默认高度（标准导航栏高度）
        BOTTOM_SAFE: 0, // 底部安全区域默认高度
        VIRTUAL_KEY: 0, // 虚拟键默认高度
    }
};

/**
 * 获取虚拟键高度的多种方法
 * @param {Object} systemInfo 系统信息对象
 * @param {Object} detailedDeviceInfo 详细设备信息对象（可选）
 * @returns {Number} 虚拟键高度
 */
const getVirtualKeyHeight = (systemInfo, detailedDeviceInfo = null) => {
    let virtualKeyHeight = 0;

    // 方法1: 通过safeArea计算虚拟键高度
    if (systemInfo.safeArea) {
        const safeAreaBottom = systemInfo.safeArea.bottom;
        const screenBottom = systemInfo.screenHeight;
        virtualKeyHeight = Math.max(0, screenBottom - safeAreaBottom);
        console.log('方法1 - safeArea计算虚拟键高度:', virtualKeyHeight);
    }

    // 方法2: 通过safeAreaInsets计算
    if (virtualKeyHeight === 0 && systemInfo.safeAreaInsets) {
        const safeAreaBottom = systemInfo.safeAreaInsets.bottom;
        if (safeAreaBottom > 0) {
            virtualKeyHeight = safeAreaBottom;
            console.log('方法2 - safeAreaInsets计算虚拟键高度:', virtualKeyHeight);
        }
    }

    // 方法3: 针对Android设备，尝试获取navigationBarHeight
    if (virtualKeyHeight === 0 && systemInfo.platform === 'android') {
        const navigationBarHeight = systemInfo.navigationBarHeight || 0;
        if (navigationBarHeight > 0) {
            virtualKeyHeight = navigationBarHeight;
            console.log('方法3 - Android navigationBarHeight:', virtualKeyHeight);
        }
    }

    // 方法4: 通过屏幕和窗口高度差计算
    if (virtualKeyHeight === 0) {
        const screenHeight = systemInfo.screenHeight || 0;
        const windowHeight = systemInfo.windowHeight || 0;
        const statusBarHeight = systemInfo.statusBarHeight || 0;
        virtualKeyHeight = Math.max(0, screenHeight - windowHeight - statusBarHeight);
        console.log('方法4 - 屏幕窗口高度差计算虚拟键高度:', virtualKeyHeight);
    }

    // 方法5: 使用详细设备信息
    if (virtualKeyHeight === 0 && detailedDeviceInfo) {
        if (detailedDeviceInfo.navigationBarHeight) {
            virtualKeyHeight = detailedDeviceInfo.navigationBarHeight;
            console.log('方法5 - 详细设备信息获取虚拟键高度:', virtualKeyHeight);
        }
    }

    return virtualKeyHeight;
};

/**
 * 获取并存储设备信息
 * 运行一次即可获取所有参数并存储到storage中
 */
const initDeviceInfo = () => {
    try {
        // 获取基础系统信息
        const systemInfo = uni.getSystemInfoSync();
        if (!systemInfo) {
            console.warn('获取系统信息失败，使用默认值');
            saveDefaultDeviceInfo();
            return;
        }

        // 尝试获取更详细的设备信息
        let detailedDeviceInfo = null;
        try {
            detailedDeviceInfo = uni.getDeviceInfoSync();
            console.log('详细设备信息:', detailedDeviceInfo);
        } catch (e) {
            console.log('getDeviceInfoSync不可用，使用基础系统信息');
        }

        // 获取屏幕尺寸
        const screenWidth = systemInfo.screenWidth || DEFAULT_VALUES.SCREEN.WIDTH;
        const screenHeight = systemInfo.screenHeight || DEFAULT_VALUES.SCREEN.HEIGHT;
        const windowWidth = systemInfo.windowWidth || screenWidth;
        const windowHeight = systemInfo.windowHeight || screenHeight;

        // 获取状态栏高度
        const statusBarHeight = Math.max(0, systemInfo.statusBarHeight || DEFAULT_VALUES.UI.STATUS_BAR);

        // 获取导航栏高度
        const navBarHeight = DEFAULT_VALUES.UI.NAV_BAR;

        // 获取底部安全区域高度
        const bottomSafeHeight = systemInfo.safeAreaInsets?.bottom || DEFAULT_VALUES.UI.BOTTOM_SAFE;

        // 获取虚拟键高度 - 使用专门的函数
        const virtualKeyHeight = getVirtualKeyHeight(systemInfo, detailedDeviceInfo);

        // 计算头部总高度
        const headerHeight = statusBarHeight + navBarHeight;

        // 计算底部总高度
        const bottomHeight = bottomSafeHeight + virtualKeyHeight;

        // 构建设备信息对象
        const deviceInfo = {
            // 屏幕信息
            screen: {
                width: screenWidth,
                height: screenHeight,
                windowWidth: windowWidth,
                windowHeight: windowHeight,
            },
            // UI组件高度
            ui: {
                statusBarHeight: statusBarHeight,
                navBarHeight: navBarHeight,
                headerHeight: headerHeight,
                bottomSafeHeight: bottomSafeHeight,
                virtualKeyHeight: virtualKeyHeight,
                bottomHeight: bottomHeight,
            },
            // 平台信息
            platform: systemInfo.platform || 'unknown',
            system: systemInfo.system || 'unknown',
            updateTime: Date.now(),
        };

        // 一次性保存设备信息对象
        storage.setDeviceInfo(deviceInfo);

        // 打印详细的计算过程
        console.log('设备信息计算详情:', {
            screen: {
                width: screenWidth,
                height: screenHeight,
                windowWidth: windowWidth,
                windowHeight: windowHeight,
            },
            ui: {
                statusBarHeight: statusBarHeight,
                navBarHeight: navBarHeight,
                headerHeight: headerHeight,
                bottomSafeHeight: bottomSafeHeight,
                virtualKeyHeight: virtualKeyHeight,
                bottomHeight: bottomHeight,
            },
            platform: systemInfo.platform || 'unknown',
            system: systemInfo.system || 'unknown',
        });

    } catch (e) {
        console.error('获取设备信息失败:', e);
        saveDefaultDeviceInfo();
    }
};

/**
 * 保存默认设备信息
 */
const saveDefaultDeviceInfo = () => {
    // 构建默认设备信息对象
    const defaultDeviceInfo = {
        // 屏幕信息
        screen: {
            width: DEFAULT_VALUES.SCREEN.WIDTH,
            height: DEFAULT_VALUES.SCREEN.HEIGHT,
            windowWidth: DEFAULT_VALUES.SCREEN.WIDTH,
            windowHeight: DEFAULT_VALUES.SCREEN.HEIGHT,
        },
        // UI组件高度
        ui: {
            statusBarHeight: DEFAULT_VALUES.UI.STATUS_BAR,
            navBarHeight: DEFAULT_VALUES.UI.NAV_BAR,
            headerHeight: DEFAULT_VALUES.UI.STATUS_BAR + DEFAULT_VALUES.UI.NAV_BAR,
            bottomSafeHeight: DEFAULT_VALUES.UI.BOTTOM_SAFE,
            virtualKeyHeight: DEFAULT_VALUES.UI.VIRTUAL_KEY,
            bottomHeight: DEFAULT_VALUES.UI.BOTTOM_SAFE + DEFAULT_VALUES.UI.VIRTUAL_KEY,
        },
        // 平台信息
        platform: 'unknown',
        system: 'unknown',
        updateTime: Date.now(),
    };

    // 一次性保存默认设备信息对象
    storage.setDeviceInfo(defaultDeviceInfo);
    console.log('已保存默认设备信息');
};

export {
    initDeviceInfo
};